package com.fs.base.excel;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;

import java.io.Serializable;

import lombok.Getter;
import lombok.Setter;

/**
 * Excel表头
 * <p>Created by Raofeicheng on 2016-11-9.</p>
 * @author Raofeicheng
 * @version 1.0
 */
@Getter
@Setter
public class HeaderColumn {

	private String field;
	private String title;
	private int width;
	private String align;
	@JSONField(name = "rowspan")
	private int rowSpan = 1;
	@JSONField(name = "colspan")
	private int colSpan = 1;
	private boolean export = true;
	private String dataFormat;
	private String comment;
	private String dictType;
	private boolean required;
	private boolean autoWidth = false;

	private Class<? extends Serializable> referClazz;
	private String relationFiled;
	private String referField;
	private boolean mustExists;
	private String regexVerify;
	private String regexVerifyMessage;
	private JSONObject dictionary;

	/**
	 * 获取列表头
	 * @param field 字段名
	 * @param title 表头名称
	 */
	public static HeaderColumn getColumn(String field, String title) {
		return getColumn(field, title, null);
	}

	/**
	 * 获取列表头
	 * @param field   字段名
	 * @param title   表头名称
	 * @param comment 表头批注
	 */
	public static HeaderColumn getColumn(String field, String title, String comment) {
		return getColumn(field, title, comment, false);
	}

	/**
	 * 获取列表头
	 * @param field    字段名
	 * @param title    表头名称
	 * @param comment  表头批注
	 * @param required 必填
	 */
	public static HeaderColumn getColumn(String field, String title, String comment, boolean required) {
		return getColumn(field, title, null, comment, null, true, required);
	}

	/**
	 * 获取列表头
	 * @param field     字段名
	 * @param title     表头名称
	 * @param autoWidth 是否自动宽度
	 */
	public static HeaderColumn getColumn(String field, String title, boolean autoWidth) {
		return getFormatColumn(field, title, null, autoWidth);
	}

	/**
	 * 获取格式化列表头
	 * @param field      字段名
	 * @param title      表头名称
	 * @param dataFormat 数据格式化字符串，只能格式化日期、数字类型
	 */
	public static HeaderColumn getFormatColumn(String field, String title, String dataFormat) {
		return getFormatColumn(field, title, dataFormat, null);
	}

	/**
	 * 获取格式化列表头
	 * @param field      字段名
	 * @param title      表头名称
	 * @param dataFormat 数据格式化字符串，只能格式化日期、数字类型
	 * @param comment    表头批注
	 */
	public static HeaderColumn getFormatColumn(String field, String title, String dataFormat, String comment) {
		return getColumn(field, title, dataFormat, comment, null, true, false);
	}

	/**
	 * 获取格式化列表头
	 * @param field      字段名
	 * @param title      表头名称
	 * @param dataFormat 数据格式化字符串，只能格式化日期、数字类型
	 * @param autoWidth  是否自动宽度
	 */
	public static HeaderColumn getFormatColumn(String field, String title, String dataFormat, boolean autoWidth) {
		return getColumn(field, title, dataFormat, null, null, autoWidth, false);
	}

	/**
	 * 获取字典列表头
	 * @param field    字段名
	 * @param title    表头名称
	 * @param dictType 字典类型
	 */
	public static HeaderColumn getDictColumn(String field, String title, String dictType) {
		return getDictColumn(field, title, dictType, true);
	}

	/**
	 * 获取字典列表头
	 * @param field     字段名
	 * @param title     表头名称
	 * @param dictType  字典类型
	 * @param autoWidth 是否自动宽度
	 */
	public static HeaderColumn getDictColumn(String field, String title, String dictType, boolean autoWidth) {
		return getColumn(field, title, null, null, dictType, autoWidth, false);
	}

	/**
	 * 获取引用列表头
	 * @param field         字段名
	 * @param title         表头名称
	 * @param comment       表头批注
	 * @param required      必填
	 * @param referClazz    引用表实体
	 * @param relationFiled 引用表关联字段
	 */
	public static HeaderColumn getManyToOneColumn(String field, String title, String comment, boolean required
		, Class<? extends Serializable> referClazz, String relationFiled) {
		return getManyToOneColumn(field, title, comment, required, referClazz, relationFiled, relationFiled);
	}

	/**
	 * 获取引用列表头
	 * @param field         字段名
	 * @param title         表头名称
	 * @param comment       表头批注
	 * @param required      必填
	 * @param referClazz    引用表实体
	 * @param relationFiled 引用表关联字段
	 * @param mustExists    外键值必须在主键表中存在
	 */
	public static HeaderColumn getManyToOneColumn(String field, String title, String comment, boolean required
		, Class<? extends Serializable> referClazz, String relationFiled, boolean mustExists) {
		return getManyToOneColumn(field, title, comment, required, referClazz, relationFiled, relationFiled, mustExists);
	}

	/**
	 * 获取引用列表头
	 * @param field         字段名
	 * @param title         表头名称
	 * @param comment       表头批注
	 * @param required      必填
	 * @param referClazz    引用表实体
	 * @param relationFiled 引用表关联字段
	 * @param referField    实际记录的引用表字段，默认为关联字段
	 */
	public static HeaderColumn getManyToOneColumn(String field, String title, String comment, boolean required
		, Class<? extends Serializable> referClazz, String relationFiled, String referField) {
		return getManyToOneColumn(field, title, comment, required, referClazz, relationFiled, referField, true);
	}

	/**
	 * 获取引用列表头
	 * @param field         字段名
	 * @param title         表头名称
	 * @param comment       表头批注
	 * @param required      必填
	 * @param referClazz    引用表实体
	 * @param relationFiled 引用表关联字段
	 * @param referField    实际记录的引用表字段，默认为关联字段
	 * @param mustExists    外键值必须在主键表中存在
	 */
	public static HeaderColumn getManyToOneColumn(String field, String title, String comment, boolean required
		, Class<? extends Serializable> referClazz, String relationFiled, String referField, boolean mustExists) {
		HeaderColumn column = getColumn(field, title, comment, required);
		column.setReferClazz(referClazz);
		column.setRelationFiled(relationFiled);
		column.setReferField(referField);
		column.setMustExists(mustExists);
		return column;
	}

	/**
	 * 获取列表头
	 * @param field      字段名
	 * @param title      表头名称
	 * @param dataFormat 数据格式化字符串，只能格式化日期、数字类型
	 * @param comment    表头批注
	 * @param dictType   字典类型
	 * @param autoWidth  是否自动宽度
	 * @param required   必填
	 */
	public static HeaderColumn getColumn(String field, String title, String dataFormat
		, String comment, String dictType, boolean autoWidth, boolean required) {
		HeaderColumn column = new HeaderColumn();
		column.setField(field);
		column.setTitle(title);
		column.setDataFormat(dataFormat);
		column.setComment(comment);
		column.setDictType(dictType);
		column.setAutoWidth(autoWidth);
		column.setRequired(required);
		return column;
	}

	/**
	 * 获取字段名
	 */
	public String getField() {
		return field;
	}

	/**
	 * 设置字段名
	 */
	public void setField(String field) {
		this.field = field;
	}

	/**
	 * 获取表头名称
	 */
	public String getTitle() {
		return title;
	}

	/**
	 * 设置表头名称
	 */
	public void setTitle(String title) {
		this.title = title;
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public String getAlign() {
		return align;
	}

	public void setAlign(String align) {
		this.align = align;
	}

	/**
	 * 获取数据格式化字符串，只能格式化日期、数字类型
	 */
	public String getDataFormat() {
		return dataFormat;
	}

	/**
	 * 设置数据格式化字符串，只能格式化日期、数字类型
	 */
	public void setDataFormat(String dataFormat) {
		this.dataFormat = dataFormat;
	}

	/**
	 * 获取表头批注
	 */
	public String getComment() {
		return comment;
	}

	/**
	 * 设置表头批注
	 */
	public void setComment(String comment) {
		this.comment = comment;
	}

	/**
	 * 获取字典类型
	 */
	public String getDictType() {
		return dictType;
	}

	/**
	 * 设置字典类型
	 */
	public void setDictType(String dictType) {
		this.dictType = dictType;
	}

	/**
	 * 获取是否必填
	 */
	public boolean isRequired() {
		return required;
	}

	/**
	 * 设置是否必填
	 */
	public void setRequired(boolean required) {
		this.required = required;
	}

	/**
	 * 获取是否自动宽度
	 */
	public boolean isAutoWidth() {
		return autoWidth;
	}

	/**
	 * 设置是否自动宽度
	 */
	public void setAutoWidth(boolean autoWidth) {
		this.autoWidth = autoWidth;
	}

	/**
	 * 获取引用表实体
	 */
	public Class<? extends Serializable> getReferClazz() {
		return referClazz;
	}

	/**
	 * 设置引用表实体
	 */
	public void setReferClazz(Class<? extends Serializable> referClazz) {
		this.referClazz = referClazz;
	}

	/**
	 * 获取引用表关联字段
	 */
	public String getRelationFiled() {
		return relationFiled;
	}

	/**
	 * 设置引用表关联字段
	 */
	public void setRelationFiled(String relationFiled) {
		this.relationFiled = relationFiled;
	}

	/**
	 * 获取实际记录的引用表字段，默认为关联字段
	 */
	public String getReferField() {
		return referField;
	}

	/**
	 * 设置实际记录的引用表字段，默认为关联字段
	 */
	public void setReferField(String referField) {
		this.referField = referField;
	}

	/**
	 * 获取是否必须存在
	 */
	public boolean isMustExists() {
		return mustExists;
	}

	/**
	 * 设置是否必须存在
	 */
	public void setMustExists(boolean mustExists) {
		this.mustExists = mustExists;
	}

	/**
	 * 获取正则校验值的正确性
	 */
	public String getRegexVerify() {
		return regexVerify;
	}

	/**
	 * 设置正则校验值的正确性
	 */
	public void setRegexVerify(String regexVerify) {
		this.regexVerify = regexVerify;
	}

	public String getRegexVerifyMessage() {
		return regexVerifyMessage;
	}

	public void setRegexVerifyMessage(String regexVerifyMessage) {
		this.regexVerifyMessage = regexVerifyMessage;
	}

}
